Skip to content

docs(pm-skill): the seventh readings increment — seven landed lines, one in-place correction, and a NON-reproduction - #16764

Merged
os-zhuang merged 7 commits into
mainfrom
claude/issue-16641-readings-seventh-increment
Sep 8, 2026
Merged

docs(pm-skill): the seventh readings increment — seven landed lines, one in-place correction, and a NON-reproduction#16764
os-zhuang merged 7 commits into
mainfrom
claude/issue-16641-readings-seventh-increment

Conversation

@hotlong

@hotlong hotlong commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Fixes #16641
Fixes #16703

Governed surface (.claude/**) — draft only. No seat flips this ready, enqueues it, or arms auto-merge (Prime Directive #14). node scripts/pm/check-governed-merges.mjs --test on the two changed paths exits 3 GOVERNED, verdict line: ⛔ GOVERNED — a human merge is the review record for this PR (#9495 regime).

Ledger 395 → 402 (+7) under the STANDING one-file exception; ceiling row and a ruledRaises record moved with it.

Patch round applied. Seat review found that delivering #16703 as an in-place rewrite cost the read-side row its SUBJECT. That row is now restored byte-identical to origin/main and the title fact pays for its own line. Details in section 2; the accounting moved +6 → +7 with it.


1. The carrier card's primary judgement: the single-label omission did NOT reproduce

The card required a single-label list_issues re-measured against a control read on a label with a KNOWN member, and ruled in advance that a non-reproduction lands no line. It did not reproduce, so no line was written for it.

This container's repo-scoped REST is 403 — probed first, not assumed: GET /repos/objectstack-ai/objectstack/issues/16641 answered 403 GitHub access is not enabled for this session. So the control channel is search_issues with qualifiers, as the card's second option allows.

Group 1 — objectui, pm:retriage, open. 2026-09-08T03:37Z

population result
subject list_issues objectui labels: [pm:retriage] state OPEN totalCount: 5, hasNextPage: false, rows == totalCount: 8444, 8390, 8388, 8126, 8115
control search_issues query repo:objectstack-ai/objectui is:open label:pm:retriage total_count: 5, incomplete_results: false: 8444, 8390, 8388, 8126, 8115

Sets IDENTICAL. Every row carries pm:retriage in its own returned label array.

Group 2 — objectstack, domain:skills, open. 2026-09-08T03:36Z

population result
subject list_issues objectstack labels: [domain:skills] state OPEN totalCount: 17, hasNextPage: false, rows == totalCount
control A search_issues query repo:objectstack-ai/objectstack is:open label:domain:skills total_count: 17, same 17 numbers
control B (known member) issue_read get on 16641 and on 16703, both at 03:3xZ both return domain:skills in labels; both PRESENT in the listing

Sets IDENTICAL: 16747, 16706, 16703, 16688, 16655, 16653, 16641, 16633, 16149, 15275, 14881, 14343, 14292, 13658, 13597, 13417, 11742.

Control B is the card's own bar — a label with a member established through a channel that is not the listing. The specimen the card was opened for (objectui 7780 carrying pm:retriage in 2026-09-07) could not be re-run: the seat had already recorded at 15:38Z that the card no longer carries that label.

Non-reproduction at n=2 groups, on a card that ruled a non-reproduction closes with the reading. The negative reading and both controls are on the card.

2. The second card — one restored row, one NEW row

This is the patch round, and the distinction is the whole finding. The first attempt replaced the read-side row in place. That row's job is to name what is discarded — an angle-bracketed span inside inline backticks, discarded whole, unescaped, undecodable — which is the load-bearing contrast with the entity-escaping row above it, the one loss that IS reversible. Replacing it left 「丢弃」 with no antecedent anywhere in the file, and no other row carries that fact (the row at 220 is about a standalone marker line in a COMMENT, a different surface).

So the read-side row is restored byte-identical to origin/main (blob c242297575d3c04205e47d9628ff0545e5d63da4, verified with cmp against git show 7c12e475e:...), and the title fact lands as its own adjacent row:

- 读侧并非一律可逆:行内反引号里的尖括号片段被 MCP 读路径整个丢弃,非转义,无从解码。   ← restored, 118 bytes
- 该丢弃亦及标题:自首个 tag 形跨度截到尾,是切不是洞 ⇒ 凭标题的总体计数只是下界。      ← NEW, 116 bytes

The new row opens with an explicit antecedent (该丢弃) and carries the four things that card measured: the loss is on the READ side, it reaches TITLES, it is a cut to the end and not a hole, and a title-derived population count is therefore only a lower bound. The card's own prohibition is honoured — the repair is NOT "stop writing angle brackets", because the bytes are correct in storage.

The false CREATE-path attribution row that card also named was already removed by PR 16701; verified absent on origin/main before editing, so it is not edited twice.

3. Rider dedup — candidate / landed / already-present / refused

Each rider was grepped against the ledger with a Chinese and an English keyword, each zero-hit grep carrying a positive control that hit.

Rider candidates: 9. Landed: 6. Already present: 3. Refused: 1 (withdrawn upstream). Plus the #16703 title row above ⇒ 7 landed lines total.

# reading verdict evidence
1 dispatch-gates self-test runs past the container's 600 s foreground cap landed zero hits for the cap and for tail --pid; positive control sleep hit line 359. Re-measured below.
2 a push re-folding an armed PR can drop the arm, no field saying so landed zero hits; adjacent rows 14/36/126 are re-arming in other contexts, not this trigger
3 draft:false then arm, queue ref within 4 min already present line 76 already sets the polling budget at 1-3 min / budget 3 min; a 4-min observation is consistent with it and weaker, so it adds no prescription
4 enable_pr_auto_merge succeeds on an already-clean PR, against its own tool description landed zero hits; rows 52-53 are about the reply ECHO, not the precondition
5 search_pull_requests returns PR labels landed, re-measured and widened the block declares three read legs all blind. Measured: BOTH PR-native MCP endpoints return full labels
6 the arm reply's method reads MERGE for a SQUASH request already present line 47 verbatim: 它存的方法恒为 merge,不论请求了什么. The empty/populated instability is line 52. Fully covered.
7 issue_write update takes a PR number for labels + assignees landed zero hits; it is the write-side mirror of read leg ① refusing PR numbers
8 list_pull_requests returns merged: false with merged_at set already present (line 21) — its merged_by half landed re-measured, below
9 update_pull_request with reviewers + explicit draft: true leaves the draft bit alone already present lines 39-42 already prescribe exactly this call for an MCP-only seat; the reading CONFIRMS a standing prescription rather than adding a fact
10 a reviewers-bearing update_pull_request flips a governed draft to ready refused withdrawn by the seat mid-flight: the PR event log named a human actor's APPROVED plus auto-merge at 03:49:17Z as the flip, not the review-request call. Written, then fully reverted; the remedy row it had rewritten is restored byte-identical.

The riders re-measured in this container

Rider 1 — CONFIRMED, and BOTH numeric figures deliberately kept OUT of the line. pnpm check:pm-dispatch-gates, foreground: started 03:45:54Z, exited 03:57:39Z — 705 s wall, exit 0. The harness moved it off the foreground at exactly 600 s, which IS the reading.

⚠️ The first draft of this row pinned the case count (1534) after rejecting the rider's drifting "about 13 minutes". A merge from main within the same hour moved that count to 1552 — measured, twice, on this branch. A figure that a routine merge falsifies in under an hour has no business in a lookup table, so the landed row names only the cap, which does not drift:

- `check:pm-dispatch-gates` 逾容器 600 秒前台上限 ⇒ detach 加 `tail --pid` 前台等;超时不是读数。

⭐ A detached run is NOT sufficient on its own, and this is why the row prescribes both halves. A first attempt started with setsid nohup ... & died at ~4 minutes having printed 1393 of its cases and no verdict line — exactly the shape that reads like a hang. Every completing run was blocked on with tail --pid.

Rider 8 — CONFIRMED at n=5 more, and its second half is new. One list_pull_requests state=closed, fields naming merged, merged_at, merged_by, labels, assignees, requested_reviewers, perPage 5: all five rows read merged: false with merged_at populated (16731, 16724, 16723, 16719, 16705), and merged_by — requested by name, and necessarily non-empty on a merged PR — is absent from every row. requested_reviewers came back on exactly one row, so an empty field is omitted rather than returned empty. Landed as: an absent field is not a value reading.

Rider 5 — re-measured, and stronger than filed. The same list_pull_requests call returned full labels on all five PR rows, and a search_pull_requests call returned full label objects on five more. Two working legs, not one.

4. Line accounting — 395 → 402

Seven landed rows at one line per deduplicated reading, 一事一行, every line at or under 120 bytes (file max after the change: 120 bytes, zero lines over; the ledger already carried pre-existing rows at exactly 120).

ONE correction is paid IN PLACE and buys nothing: the PR-label block's opening row, which read PR 标签的三条读腿全盲、两条静默 — with leg ④ now answering, that framing would have sent a reader to the payload fallback past a working instrument. It now scopes the blindness to the issue-shaped legs and points at the native endpoints.

⚠️ Nothing was paid by re-wrap: the fourth increment MEASURED zero line-neutral folds among this file's adjacent rule pairs, and re-wrap funding is refused per the 2026-08-17 rule in any case.

The ceiling row moves 395 → 402 with a new ruledRaises record quoting the standing exception verbatim, dated 2026-09-08, delta 7. Gate verdict lines:

✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/platform-readings.md is 402 lines (ceiling 402; headroom 0).
✓ check-skill-line-ratchet: cross-file move into .claude/skills/pm-dispatch/references/platform-readings.md: +11 (314→402, less 77 lines of ordinary ruled raise) against a net source decrease of 20

The move's own raise is unchanged at +11 — which is the whole point of recording the increment as a ruled raise rather than carrying was forward.

5. Gates — 38 derived, 38 run, 0 NOT MEASURED

The dispatch's list was 16, derived before the ratchet script was in the file surface; re-derived inside the worktree it is 38. Re-run in full on the final merged tree:

Run reconciliation — 38 derived, 38 run, 0 NOT-MEASURED, 0 UNRUN.
✓ dispatch-gates --ran: 38 derived famil(ies) accounted for — 38 run, 0 NOT-MEASURED.

All 38 exit 0, including ✓ dispatch-gates self-test: 1552 cases pass. (0 failures). Three worth naming:

  • pnpm --filter @objectstack/lint run check:doc-formula-expressions exited 3 — PREREQUISITE NOT MET on a fresh worktree, two packages unbuilt. That is NOT a finding and NOT a red; cleared by building them under the shared verify lock and re-run to exit 0.
  • check-governed-merges --test exits 3 GOVERNED by design, as quoted at the top.
  • The reconciliation was re-derived twice after STALE TREE warnings — the tool refused to let a derivation stand on a tree behind origin/main whose own derivation files had moved. Both times the fix was to merge main and derive again.

Every exit code was captured before any pipe (cmd > log 2>&1; EXIT=$?), never through one.

The ratchet script has no separate test file — git grep for its name under tests finds only an audit document. Its test surface is its own --self-test, which pnpm check:pm-skill-ratchet runs ahead of the gate in the same script; both legs are in the exit 0 above.

6. Mergeability and changeset

origin/main at 8b37a0973, merged into this branch; head d96ad3037. Neither merge touched either changed file (git log on those paths across the range is empty — a git diff between the tips shows them only because this branch's own edits are on one side), and neither left an os-regen deferral. Merge-tree probe from a throwaway bare clone with no merge driver registered, as AGENTS.md requires:

git --git-dir=PROBE.git merge-tree --write-tree --name-only 8b37a0973 d96ad3037
→ exit 0, tree 722f63d652d482cda580f181ccc7a6465a7776d8, no conflicted paths

skip-changeset: both paths publish nothing. .claude/** and scripts/pm/** are on the not-published fast track — no package files[] ships either.

7. Acceptance notes — out of scope, filed and not filed

Filed: issue 16762 — while taking the control read above, both qualifier-shaped search_issues queries returned the EXACT label-filtered population (5/5 and 17/17 against the deterministic channel), where the ledger records that a qualifier form answers total_count: 0. Deliberately NOT written onto the ledger here: the ledger's own rows record that this tool's failures are SESSION-scoped, so a healthy session is no more a fleet-wide fact than a broken one was. That is a card and a second session's re-measure, not an edit — and the standing prohibition is cheap to obey meanwhile. Dedup ran first: five related cards, all closed, none covering it.

Noted, not filed — MCP create_pull_request appended a SECOND session-URL footer under a rule line to a body that already carried one; the ledger records that append shape only for bare REST POST /pulls, and its own row warns the shape varies by channel AND action. A candidate for the NEXT increment; not landed here because it changes no prescription (the standing "read the body back after writing" rule already covers it). Carrier: the next author of that footer row.

Noted, not filed — PM's mechanism assumption 2 is falsified: there is no "write path" section in the ledger (zero hits for both spellings; positive control 写侧 hits 11). The file has exactly five sections, and PR 16701 did not add one. Lines were placed by the existing structure instead. Carrier: this PR's reviewer, who would otherwise look for a section that does not exist. Assumption 3 held — the CEILINGS row is the sole source of the ceiling; the other 395 literals in scripts/ belong to an unrelated docs count and an anchor surface.

维护者速读(草稿)

改了什么 — 两个文件。平台读数账本加 7 行、原地改写 1 行(395 → 402);棘轮脚本里该文件的上限行跟着抬到落地行数,并按常设裁决补一条 ruledRaises 记录(delta 7)。没有代码改动,没有发布物。

为什么改 — 链首那张卡要求先复测「单标签列举会漏项」这条一次性观察,复测没有复现,所以它一行都没写(卡片自己就是这么定的)。真正落地的是同一批次里已去重的 6 条平台读数,加上成员卡那条标题截断的新行:尖括号的丢失在读侧、也影响标题、而且是从首个标签形跨度切到结尾——不是缺个洞,是被截断,读上去仍像一句完整的标题,所以凭标题做的总体计数只是下界。

风险与代价(含回滚) — 风险低:改的是给 agent 看的操作手册,不进构建产物、不影响运行时,skip-changeset 成立。代价是账本长了 7 行,上限抬到 402、余量归零,下次增量仍要按同样纪律付账。回滚就是 revert 这一个 PR,两个文件一起回到 395,棘轮会自己变绿——没有数据迁移、没有下游依赖。

⚠️ 两处请您留意,都是飞行中被推翻过一次的判断,已按复核结论改正:① 成员卡最初是「原地改写」交付,复核指出那样会让原句失去主语(到底丢的是什么),现已把原句逐字节还原、标题事实另起一行,账因此从 +6 变成 +7;② 曾按上游指示写入第 10 条候选(说请审调用会把治理面草稿翻成 ready),上游随后查证是人工 actor 的批准造成的翻转并撤回,该行连同它改写的补救行已完整还原。另外第 1 条读数里我一度把用例数 1534 写进账本,一次 merge 就把它变成 1552,所以最终那行只留「逾 600 秒前台上限」这个不会漂的事实。

席位意见 — (留空,待席位复核填写)

你要做的 — 这是受管面(.claude/**),按 Prime Directive #14,只能由您手工合并:任何 agent 都不会把它转 ready、不会入队、不会挂 auto-merge。您需要做的就是读一遍第 1 节的复测读数(尤其「没复现」这个结论您认不认)、第 2 节还原后的那一对行、第 3 节的去重判定表,以及第 4 节的行数账;认可就手工合并,不认可就直接在 PR 上说哪一条要撤。

…dings, two in-place corrections

Ledger 395 -> 401 under the standing one-file exception; ceiling row and a
`ruledRaises` record updated to match.

Claude-Session: https://claude.ai/code/session_01P58euzUXCVJNwmhuPC9DXY
Co-authored-by: Claude <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…rifting minute figure

Re-measured in this container: 1534 cases, exit 0, 705 s wall — past the 600 s
foreground cap either way, which is the load-bearing half.

Claude-Session: https://claude.ai/code/session_01P58euzUXCVJNwmhuPC9DXY
Co-authored-by: Claude <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…tion pays for its own line

Review finding: replacing the 「读侧并非一律可逆」 row in place cost it the
subject of 丢弃 — the original names WHAT is discarded (an angle-bracketed span
inside inline backticks, whole, unescaped, undecodable), which is the contrast
with the reversible entity-escaping row above it, and no other row carries it.

The row is restored byte-identical to origin/main and the title fact lands as
its own adjacent row. Ceiling 401 -> 402, ruledRaises delta 6 -> 7.

Claude-Session: https://claude.ai/code/session_01P58euzUXCVJNwmhuPC9DXY
Co-authored-by: Claude <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… 1534 to 1552 within the hour

The load-bearing half is the 600 s foreground cap, which does not drift.

Claude-Session: https://claude.ai/code/session_01P58euzUXCVJNwmhuPC9DXY
Co-authored-by: Claude <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…matching its delta

Comment-only. The record's delta is 7 and the CEILINGS comment above it tallies
"+7 exactly"; this one sentence still read +6 from before the title row landed.

Claude-Session: https://claude.ai/code/session_01P58euzUXCVJNwmhuPC9DXY
Co-authored-by: Claude <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

hotlong commented Sep 8, 2026

Copy link
Copy Markdown
Contributor Author

维护者速读(终稿)

席位复核记录:#16641 上的 ACCEPT 评论(skills 席,hotlong,session session_01P58euzUXCVJNwmhuPC9DXY,2026-09-08T05:20Z);#16703 上有成员指针。head 295579723

改了什么

两个文件。平台读数账本 .claude/skills/pm-dispatch/references/platform-readings.md 加 7 行、原地改写 1 行(395 → 402):六条本班次去重后的读数(推送重折会静默掉 auto-merge 挂载;fields 请求 merged_by 不返回;enable_pr_auto_merge 对已 clean 的 PR 照样成功;PR 标签有原生读腿 ④;issue_write update 接受 PR 号而读腿 ① 拒绝;check:pm-dispatch-gates 超容器 600 秒前台上限 ⇒ detach + tail --pid),加 #16703 那条「尖括号丢失在读侧、也及标题、是从首个 tag 形跨度截到尾的切、标题计数只是下界」。棘轮脚本里该文件的上限行抬到 402,按常设裁决补一条 ruledRaises 记录(delta 7)。

为什么改

链首 #16641 要求先复测「单标签列举会漏项」,复测没有复现(两组、含已知成员对照),按卡自己的规矩一行不写、随读数关卡。真正落地的是同批次里已去重的六条平台事实,以及 #16703 那条被改坏又被复核还原的行:第一版把原句原地改写,原句的主语(到底丢的是什么)就没了;席位要求逐字节还原原句、标题事实另起一行——现在的形态是两行各说各的事。

风险与代价(含回滚)

风险低:改的是给 agent 看的操作手册,不进构建产物、不影响运行时,skip-changeset 成立。代价:账本长 7 行,上限抬到 402、余量归零,下一次增量(载体卡 #16779 已立)仍按同样纪律付账。回滚 = revert 这一个 PR,两个文件一起回到 395,棘轮自绿。⚠️ 飞行中被推翻过两次的判断都已改正:一是 #16703 的原地改写(已还原 + 独立成行,账从 +6 改 +7);二是曾按席位指示写入的第 10 条候选(「请审调用会把草稿翻 ready」)——席位随后查 PR 事件日志证实翻转是人工批准造成的,撤回,该行连同它改写的补救行已完整还原。

席位意见

同意合并。常设一文件例外的四个条件席位逐条核过(逐条核实、去重计数 9/6/3/1、一事一行、不计重排);两轮补丁的目标(行 223 逐字节还原、+7 注释、PR 标题)在分支上逐一验证;38/38 门禁对账,补丁轮四项门禁绿;head 295579723 全部 check run 05:18Z 读到 success/skipped;check-governed-merges --test 两路径 exit 3(受管)。

你要做的

受管面(.claude/**),按 #9495 规矩由人合:请读 PR 正文第 1 节「没复现」的两组读数、第 2 节还原后的那一对行、第 3 节的去重判定表;认可就批准或直接合并——席位在授权批准落地且全绿时挂 auto-merge,⛔ 不翻 ready、不入队。只问一字:这 7 行读数与 402 的上限你认吗——


Generated by Claude Code

@hotlong
hotlong requested a review from os-zhuang September 8, 2026 05:19
@os-zhuang
os-zhuang marked this pull request as ready for review September 8, 2026 06:03
@os-zhuang
os-zhuang enabled auto-merge September 8, 2026 06:03
@os-zhuang
os-zhuang added this pull request to the merge queue Sep 8, 2026
Merged via the queue into main with commit f315144 Sep 8, 2026
37 of 39 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment